# 1.使用tensorflow2.0配合keras完成如下处理
#
# 读取cifar2数据集，完成x，y的处理
# 使用lenet完成模型处理
# 配合适应的超参数
# 完成模型准确率计算

# 经典卷积神经网络结构——LeNet-5、AlexNet、VGG-16
# https://www.cnblogs.com/wuliytTaotao/p/9544625.html

import tensorflow as tf
from tensorflow.keras import optimizers,losses,metrics
from tensorflow.keras.layers import Activation,Dropout,Dense,Conv2D,MaxPool2D,Flatten

# 数据图片读取
def load_img(img_path,size=(32,32)):
    # 使用正则获取文件名称，判断图片的类别归属问题
    label = tf.constant(1,tf.int8) if tf.strings.regex_full_match(img_path,'.*automobile.*') else tf.constant(0,tf.int8)
    # 读取图片，进行编码处理
    img = tf.io.read_file(img_path)# 字节
    img = tf.image.decode_jpeg(img) # 解码  tensor
    img = tf.image.resize(img,size)/255.0  #[num, 32, 32, 3]
    return (img,label)

# 训练数据加载
# 使用 map 时设置num_parallel_calls 让数据转换过程多进程执行
ds_train = tf.data.Dataset.list_files('../../../../../large_data/DL2/_many_files/cifar2/train/*/*.jpg')\
    .map(load_img,num_parallel_calls=tf.data.experimental.AUTOTUNE)\
    .shuffle(buffer_size=1000).batch(100)\
    .prefetch(tf.data.experimental.AUTOTUNE)

#测试集数据
ds_test = tf.data.Dataset.list_files('../../../../../large_data/DL2/_many_files/cifar2/test/*/*.jpg')\
    .map(load_img,num_parallel_calls=tf.data.experimental.AUTOTUNE)\
    .batch(100)\
    .prefetch(tf.data.experimental.AUTOTUNE)
#使用 prefetch 方法让数据准备和参数迭代两个过程相互并行

model = tf.keras.Sequential([ # [num, 32, 32, 3]
    Conv2D(6,(5,5),(1,1), activation='relu'), # [num, 28, 28, 6] 卷积核(5,5) 步长(1,1),卷积核个数6
    MaxPool2D((2,2),(2,2),padding='same'),# [num, 14, 14, 6]  池化核(2,2) 步长(2,2)
    Conv2D(16, (5, 5), (1, 1), activation='relu'),# [num, 10, 10, 16]
    MaxPool2D((2, 2), (2, 2), padding='same'), #[num, 5, 5, 16]
    Flatten(), # 展平 一维处理
    Dense(120,activation='relu'),
    Dense(84,activation='relu'),
    Dense(1,activation='sigmoid'),
])

model.compile(
    optimizer=optimizers.Adam(),
    loss=losses.BinaryCrossentropy(),
    metrics=['accuracy']
)
model.build(input_shape=(None,32,32,3)) # 使用build定义输入模型的维度
model.summary()

model.fit(ds_train,epochs=15,validation_data=ds_test,workers=0)



